// 初始化 Set
// Set函数可以接受一个数组（或者具有 iterable 接口的其他数据结构）作为参数，用来初始化

// Set 操作: add, delete, has, clear
// 迭代操作: keys, values, entries, forEach
let mySet = new Set()
// add 操作
mySet.add(1)
mySet.add(5)
// 因为唯一性，mySet 只会有一个5
mySet.add(5)
mySet.add('some text')

let o = { a: 1, b: 2 }
mySet.add(o)
// 存储地址不一样，会被添加
mySet.add({ a: 1, b: 2 })

// console.log('当前集合:', mySet)

// delete 操作
mySet.delete(o)
console.log('当前集合:', mySet)

// has 操作
console.log('是否有5:', mySet.has(5))

// clear 操作
// mySet.clear()
// console.log('当前集合:', mySet)

// 迭代
for (let item of mySet) {
    console.log('for...of:', item)
}
for (let item of mySet.keys()) {
    console.log('keys()', item)
}
for (let item of mySet.values()) {
    console.log('values()', item)
}
for (let [key, value] of mySet.entries()) {
    // 由于 Set 结构没有键名，只有键值（或者说键名和键值是同一个值），所以 keys 方法和 values 方法的行为完全一致。
    console.log('entries()', key, value)
}
mySet.forEach((value, key) => console.log('forEach', key, value))

// 常用的集合操作
// 1. 去重
const arr = [1, 1, 2, 2];
const arr2 = [...new Set(arr)];
console.log('去重', arr2)

// 2. 判断元素是否在集合中
const set = new Set(arr);
const has = set.has(3);
console.log('判断元素是否存在', has)

// 3. 求交集
const set2 = new Set([2, 3]);
const set3 = new Set([...set].filter(item => set2.has(item)));
console.log('交集结果', set3)

// 4. 求两个数组的交集
function interSection(arr1, arr2) {
    return [...new Set(arr1)].filter(n => arr2.includes(n))
}
console.log(interSection([1, 2, 3, 5], [2, 4, 5]))

// 5. 求差集（set1中有，set2中没有的）
function diffSet(set1, set2){
    return new Set([...set1].filter(x => !set2.has(x)));
}
console.log(diffSet(new Set([1,2]), new Set([2, 3])))